<?php

require_once('publiccontroller.php');

// Affichage et gestion du formulaire d'inscription
class Inscription extends PublicController
{
	function Inscription()
	{
		parent::PublicController();
		$this->set_page_title('Candidature en ligne');
		$this->load->helper('form');
		$this->load->library('email');
	}

	function index()
	{
		$this->load->model('Content');
		$data['content'] = $this->Content->get_by_key('inscriptions');
		$this->_display('intro', $data);
	}

	function show()
	{
		// année de promotion en cours
		$this->load->model('Promotion');
		$this->load->model('Insc');
		$promo = $this->Promotion->get_current();
		$data['current_promo'] = $promo->year;

		// Informations de bases pour le formulaire
		$data['form_action'] = 'inscription/submission';
		$data['form_atr'] = array('id' => 'form_inscription');

		/*
		- Form generation -
		Les indications entre parenthèse sont les parties à remplacer
		Format : $data['steps']['step(+numero)']['(id_de_l_element_input)'] = array();
		array() est une array d'attributs pouvant prendre les clefs :
		- 'type' pour définir l'input qui sera généré
		  accepte les valeurs suivantes : 'input', 'hidden', 'password', 'textarea', 'upload', 'dropdown', 'checkbox', 'radio'

		Cas particuliers :
		- si l'id (3e poste) est '__desc__', ce sera le titre utilisé pour l'étape précisée dans le 2e poste.
		- si l'id (3e poste) est 'title[X]', ce sera transformé en titre de transition entre plusieurs inputs.
		*/

		$field_labels = $this->Insc->map_field_labels();
		// extra fields
		$field_labels['name'] = 'Nom';
		$field_labels['firstname'] = 'Prénom';
		$field_labels['email'] = 'E-mail '.tooltip_tag("Vous devez indiquer un e-mail valide afin de poursuivre l'inscription, celui-ci sera votre identifiant de connexion au site");

		// @TODO : gérer les oui/non avec des radios plutôt que des inputs
		// STEP 1
		$data['steps']['step1']['__desc__'] = 'Civilités';
		$data['steps']['step1']['name'] = array('type' => 'input');
		$data['steps']['step1']['firstname'] = array('type' => 'input');
		$data['steps']['step1']['email'] = array('type' => 'input');

		$data['steps']['step1']['date_naissance'] = array('type' => 'input', 'options' => array('maxlength' => '10', 'class' => 'check_birthdate'));
		$data['steps']['step1']['lieu_naissance'] = array('type' => 'input');
		$data['steps']['step1']['nationalite'] = array('type' => 'input');
		$data['steps']['step1']['adresse'] = array('type' => 'input');
		$data['steps']['step1']['ville'] = array('type' => 'input');
		$data['steps']['step1']['code_postal'] = array('type' => 'input');
		$data['steps']['step1']['telephone_fixe'] = array('type' => 'input', 'options' => array('maxlength' => '10', 'class' => 'check_phone'));
		$data['steps']['step1']['telephone_portable'] = array('type' => 'input', 'options' => array('maxlength' => '10', 'class' => 'check_phone'));
		$data['steps']['step1']['dernier_diplome'] = array('type' => 'input');
		$data['steps']['step1']['dernier_diplome_etb'] = array('type' => 'input');
		$data['steps']['step1']['autre_candidature'] = array('type' => 'input', 'options' => array('maxlength' => '3', 'class' => 'check_yesno'));
		$data['steps']['step1']['autre_candidature_details'] = array('type' => 'textarea', 'options' => array('rows' => '5', 'cols' => '50', 'class' => 'optional'));
		$data['steps']['step1']['candidat_classique'] = array('type' => 'input', 'options' => array('maxlength' => '3', 'class' => 'check_yesno'));

		// STEP 2
		$data['steps']['step2']['__desc__'] = 'Vos études et vos diplômes';
		$data['steps']['step2']['title'] = '<span class="subtitle">Baccalauréat (ou titre équivalent)</span>';
		$data['steps']['step2']['bacca_annee'] = array('type' => 'input');
		$data['steps']['step2']['bacca_serie'] = array('type' => 'input');
		$data['steps']['step2']['bacca_lieu'] = array('type' => 'input');
		$data['steps']['step2']['bacca_mention'] = array('type' => 'input');

		$data['steps']['step2']['title2'] = '<span class="subtitle">Votre cursus depuis le Baccalauréat</span>';
		$data['steps']['step2']['postbac_annee_1'] = array('type' => 'input');
		$data['steps']['step2']['postbac_diplome_1'] = array('type' => 'input');
		$data['steps']['step2']['postbac_etb_1'] = array('type' => 'input');
		$data['steps']['step2']['postbac_result_1'] = array('type' => 'input');
		for ($i = 2; $i <= 6; ++$i) {
			// previous title = 2
			$data['steps']['step2']['title'.($i + 1)] = '<span class="separator hidden cursus_'.$i.'"></span>';
			$data['steps']['step2']['postbac_annee_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden cursus_'.$i));
			$data['steps']['step2']['postbac_diplome_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden cursus_'.$i));
			$data['steps']['step2']['postbac_etb_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden cursus_'.$i));
			$data['steps']['step2']['postbac_result_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden cursus_'.$i));
		}
		$data['steps']['step2']['add_cursus'] = array('type' => 'submit', 'options' => array('value' => 'Ajouter un élément du cursus', 'class' => 'button_add'));

		// STEP 3
		$data['steps']['step3']['__desc__'] = 'Vos connaissances';
		$data['steps']['step3']['title'] = '<span class="subtitle">Connaissances en informatique</span>';
		$data['steps']['step3']['langages'] = array('type' => 'textarea', 'options' => array('rows' => '5', 'cols' => '50'));
		$data['steps']['step3']['langages_level'] = array('type' => 'input', 'options' => array('maxlength' => '1', 'class' => 'check_one_lvl'));

		$data['steps']['step3']['title2'] = '<span class="separator"></span>';
		$data['steps']['step3']['analyse'] = array('type' => 'textarea', 'options' => array('rows' => '5', 'cols' => '50'));
		$data['steps']['step3']['analyse_level'] = array('type' => 'input', 'options' => array('maxlength' => '1', 'class' => 'check_one_lvl'));

		$data['steps']['step3']['title3'] = '<span class="separator"></span>';
		$data['steps']['step3']['sgbd'] = array('type' => 'textarea', 'options' => array('rows' => '5', 'cols' => '50'));
		$data['steps']['step3']['sgbd_level'] = array('type' => 'input', 'options' => array('maxlength' => '1', 'class' => 'check_one_lvl'));

		$data['steps']['step3']['title4'] = '<span class="separator"></span>';
		$data['steps']['step3']['reseau'] = array('type' => 'textarea', 'options' => array('rows' => '5', 'cols' => '50'));
		$data['steps']['step3']['reseau_level'] = array('type' => 'input', 'options' => array('maxlength' => '1', 'class' => 'check_one_lvl'));

		$data['steps']['step3']['title5'] = '<span class="subtitle">Connaissances en langues vivantes</span>';
		$data['steps']['step3']['langues_bacca'] = array('type' => 'textarea', 'options' => array('rows' => '5', 'cols' => '50'));
		$data['steps']['step3']['langues_postbacca'] = array('type' => 'input');
		$data['steps']['step3']['langues_anglais'] = array('type' => 'input', 'options' => array('maxlength' => '5', 'class' => 'check_three_lvl'));
		for ($i = 2; $i <= 3; ++$i) {
			// previous title = 5
			$data['steps']['step3']['title'.($i + 4)] = '<span class="separator hidden langues_'.$i.'"></span>';
			$data['steps']['step3']['langues_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden langues_'.$i));
			$data['steps']['step3']['langues_details_'.$i] = array('type' => 'input', 'options' => array('maxlength' => '5', 'class' => 'optional check_three_lvl hidden langues_'.$i));
		}
		$data['steps']['step3']['add_langues'] = array('type' => 'submit', 'options' => array('value' => 'Ajouter une langue', 'class' => 'button_add'));
		$data['steps']['step3']['title8'] = '<span class="separator"></span>';

		$data['steps']['step3']['infos_compl'] = array('type' => 'textarea', 'options' => array('rows' => '5', 'cols' => '50', 'class' => 'optional'));

		// STEP 4
		$data['steps']['step4']['__desc__'] = 'Vos expériences';
		$data['steps']['step4']['title'] = '<span class="subtitle">Veuillez décrire ci-dessous les différents stages effectués et emplois occupés (détailler clairement les postes occupés, en particulier si les missions confiées comportaient des réalisations informatiques)</span>';
		$data['steps']['step4']['exp_date_1'] = array('type' => 'input', 'options' => array('class' => 'optional'));
		$data['steps']['step4']['exp_desc_1'] = array('type' => 'input', 'options' => array('class' => 'optional'));
		$data['steps']['step4']['exp_societe_1'] = array('type' => 'input', 'options' => array('class' => 'optional'));
		$data['steps']['step4']['exp_ville_1'] = array('type' => 'input', 'options' => array('class' => 'optional'));
		for ($i = 2; $i <= 3; ++$i) {
			// précédent title = 1
			$data['steps']['step4']['title'.$i] = '<span class="separator hidden exp_'.$i.'"></span>';
			$data['steps']['step4']['exp_date_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden exp_'.$i));
			$data['steps']['step4']['exp_desc_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden exp_'.$i));
			$data['steps']['step4']['exp_societe_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden exp_'.$i));
			$data['steps']['step4']['exp_ville_'.$i] = array('type' => 'input', 'options' => array('class' => 'optional hidden exp_'.$i));
		}
		$data['steps']['step4']['add_exp'] = array('type' => 'submit', 'options' => array('value' => 'Ajouter une expérience', 'class' => 'button_add'));
		$data['steps']['step4']['title4'] = '<span class="separator"></span>';

		$data['steps']['step4']['projet_pro'] = array('type' => 'textarea', 'options' => array('rows' => '7', 'cols' => '50'));
		$data['steps']['step4']['entreprise'] = array('type' => 'textarea', 'options' => array('rows' => '5', 'cols' => '50'));

		$data['steps']['step4']['title5'] = '<span class="subtitle">Attention :<br />Vérifiez bien l\'exactitude des informations fournies, vous ne pourrez plus les modifier après la validation finale</span>';

		// Bouton de soumission de toutes les étapes (@TODO: sauvegarde à chaque étape?)
		$data['submit'] = array('id' => 'submission', 'name' => 'submission', 'value' => 'Valider mon inscription');

		// Chargement de la vue
		$data['field_labels'] = $field_labels;
		$this->_display('show', $data);
	}

	function submission()
	{
		/*
		_Interface avec les champs du formulaire
		Savoir si un champs a été rempli : ($this->input->post('field_id') != '')
		Accéder à un champs : $this->input->post('field_id')

		_Champs reçus par ajax dans $_POST (tous présents même si non-remplis)
		adresse, analyse, analyse_level, autre_candidature, autre_candidature_details,
		bacca_annee, bacca_lieu, bacca_mention, bacca_serie, candidat_classique,
		code_postal, date_naissance, dernier_diplome, dernier_diplome_etb, email,
		entreprise, exp_date_1, exp_date_2, exp_date_3, exp_desc_1, exp_desc_2,
		exp_desc_3, exp_societe_1, exp_societe_2, exp_societe_3, exp_ville_1,
		exp_ville_2, exp_ville_3, infos_compl, langages, langages_level, langues_2,
		langues_3, langues_anglais, langues_bacca, langues_details_2, langues_details_3,
		langues_postbacca, lieu_naissance, nationalite, name, postbac_annee_1
		postbac_annee_2, postbac_annee_3, postbac_annee_4, postbac_annee_5,
		postbac_annee_6, postbac_diplome_1, postbac_diplome_2, postbac_diplome_3,
		postbac_diplome_4, postbac_diplome_5, postbac_diplome_6, postbac_etb_1,
		postbac_etb_2, postbac_etb_3, postbac_etb_4, postbac_etb_5, postbac_etb_6,
		postbac_result_1, postbac_result_2, postbac_result_3, postbac_result_4,
		postbac_result_5, postbac_result_6, firstname, projet_pro, reseau, reseau_level,
		sgbd, sgbd_level, telephone_fixe, telephone_portable, ville
		*/

		$this->load->model('User');
		$this->load->model('UserStatus');

		/*
		 * Etape 0 : champs User
		 */
		$new_user = new User();
		$generated_password = generate_password(); // passage par variable nécessaire pour l'envoi par mail
		$new_user->password = crypt_password($generated_password);
		$new_user->created_at = $new_user->updated_at = date_db_format();
		$new_user->status_id = $this->UserStatus->get_id_by_code('candidat_complete');

		$errors = $this->User->update($new_user, $_POST);
		$ajax_valid = false;

		/*
		 * Etape 1
		 */
		if($this->input->post('date_naissance') == '')
			$errors[] = 'Vous devez préciser votre date de naissance';

		if(!check_bithdate($this->input->post('date_naissance')))
			$errors[] = 'La date de naissance doit être au format JJ/MM/AAAA';

		if($this->input->post('lieu_naissance') == '')
			$errors[] = 'Vous devez préciser votre lieu de naissance';

		if($this->input->post('nationalite') == '')
			$errors[] = 'Vous devez préciser votre nationalité';

		if($this->input->post('adresse') == '')
			$errors[] = 'Vous devez préciser votre adresse';

		if($this->input->post('ville') == '')
			$errors[] = 'Vous devez préciser votre ville';

		if($this->input->post('code_postal') == '')
			$errors[] = 'Vous devez préciser votre code postal';

		if($this->input->post('telephone_fixe') == '' && $this->input->post('telephone_portable') == '')
			$errors[] = 'Vous devez préciser au moins un numéro de téléphone';

		if($this->input->post('dernier_diplome') == '')
			$errors[] = 'Vous devez préciser votre dernier diplôme obtenu ou en cours';

		if($this->input->post('dernier_diplome_etb') == '')
			$errors[] = 'Vous devez préciser l\'établissment de votre dernier diplôme obtenu ou en cours';

		if($this->input->post('autre_candidature') == '')
			$errors[] = 'Vous devez préciser si vous avez effectué d\'autres candidatures';
		elseif($this->input->post('autre_candidature') != 'oui' && $this->input->post('autre_candidature') != 'non')
			$errors[] = 'Votre réponse par rapport aux autres candidatures doit être "oui" ou "non"';

		if($this->input->post('candidat_classique') == '')
			$errors[] = 'Vous devez préciser votre décision par rapport à la candidature en formation classique';
		elseif($this->input->post('candidat_classique') != 'oui' && $this->input->post('candidat_classique') != 'non')
			$errors[] = 'Votre réponse par rapport à la candidature classique doit être "oui" ou "non"';

		/*
		 * Etape 2
		 */
		if($this->input->post('bacca_annee') == '')
			$errors[] = 'Vous devez préciser l\'année d\'obtention de votre baccalauréat';

		if($this->input->post('bacca_serie') == '')
			$errors[] = 'Vous devez préciser la série de votre baccalauréat';

		if($this->input->post('bacca_lieu') == '')
			$errors[] = 'Vous devez préciser le lieu d\'obtention de votre baccalauréat';

		if($this->input->post('bacca_mention') == '')
			$errors[] = 'Vous devez préciser la mention obtenue au baccalauréat';

		if($this->input->post('postbac_annee_1') == '' ||
		   $this->input->post('postbac_diplome_1') == '' ||
		   $this->input->post('postbac_etb_1') == '' ||
		   $this->input->post('postbac_result_1') == '')
			$errors[] = 'Vous devez préciser au moins un cursus post-bac complet';

		/*
		 * Etape 3
		 */
		if($this->input->post('langages') == '')
			$errors[] = 'Vous devez préciser les langages de programmation que vous connaissez';

		if($this->input->post('langages_level') == '')
			$errors[] = 'Vous devez préciser votre niveau en programmation';

		if($this->input->post('analyse') == '')
			$errors[] = 'Vous devez préciser les méthodes d\'analyse que vous connaissez';

		if($this->input->post('analyse_level') == '')
			$errors[] = 'Vous devez préciser votre niveau en méthodes d\'analyse';

		if($this->input->post('sgbd') == '')
			$errors[] = 'Vous devez préciser les système de gestion de bases de données que vous connaissez';

		if($this->input->post('sgbd_level') == '')
			$errors[] = 'Vous devez préciser votre votre niveau en bases de données';

		if($this->input->post('reseau') == '')
			$errors[] = 'Vous devez préciser vos connaissances en systèmes informatiques et réseaux';

		if($this->input->post('reseau_level') == '')
			$errors[] = 'Vous devez préciser votre niveau en systèmes informatiques et réseaux';

		if($this->input->post('langues_bacca') == '')
			$errors[] = 'Vous devez préciser les langues que vous avez étudiées en terminale';

		if($this->input->post('langues_anglais') == '')
			$errors[] = 'Vous devez préciser votre niveau d\'anglais';

		/*
		 * Etape 4
		 */
		if($this->input->post('projet_pro') == '')
			$errors[] = 'Vous devez donner une description succinte de votre projet professionnel';

		if($this->input->post('entreprise') == '')
			$errors[] = 'Vous devez préciser si vous êtes en contact avec une entreprise';

		/*
		 * Traitements finaux
		 */
		if(!count($errors)) {
			// Pas d'erreurs, on essaye d'enregistrer les infos

			// save user and archive his status
			if ($this->User->save($new_user)
				&& $this->User->set_status($new_user, $new_user->status_id)) {

				/* $this->User->set_status_from_code($new_user, 'candidat_complete');
				$this->User->save_status_id($new_user); */

				// L'utilisateur a bien été créé,
				// on enregistre toutes les informations de l'inscription dans la table 'insc_entries'
				$field_set = array();
				foreach($_POST as $key => $value) {
					if($value != '' && !in_array($key, array('email', 'name', 'firstname')))
						$field_set[$key] = $this->input->post($key);
				}
				$errors = $new_user->insc_field_submission($field_set);

				// Préparation et envoi du mail
				$email_config['mailtype'] = 'html';
				$this->email->initialize($email_config);
				$this->email->clear();

				$this->email->from(CONTACT_EMAIL, 'L3 MIAGE Paris Descartes');
				$this->email->to($new_user->email);
				$this->email->subject('Inscription en L3 MIAGE par Apprentissage');
				$email_infos = array(
					'name' => $new_user->name,
					'firstname' => $new_user->firstname,
					'password' => $generated_password,
					'email' => $new_user->email,
					'link_candidat' => base_url().'candidat/',
					'link_faqs' => base_url().'faqs/',
					'link_home' => base_url(),
					'contact_tel' => CONTACT_PHONE,
					'contact_email' => CONTACT_EMAIL
				);
				$message = $this->load->view('public/inscription/email_template', $email_infos, TRUE);
				$this->email->message(nl2br($message));

				if($this->email->send()) {
					if(count($errors)) {
						// Tentative de cassage total de l'appli, 'insc_field_submission' a renvoyé des champs non-existants
						$data['message'] = 'L\'inscription s\'est bien passée, vous allez recevoir un e-mail de confirmation. Cependant, certains champs n\'ont pas pu être enregistrés : '.implode(' ; ', $errors);
						$data['class'] = 'warning';
					}
					else
						$data['message'] = 'Inscription enregistrée avec succès ! Vous allez recevoir un e-mail de confirmation';
				}
				else {
					if(count($errors))
						$data['message'] = 'L\'inscription a été enregistrée avec succès, mais l\'envoi de l\'e-mail de confirmation n\'a pas fonctionné. De plus, certains champs n\'ont pas pu être enregistrés : '.implode(' ; ', $errors);
					else
						$data['message'] = 'L\'inscription a été enregistrée avec succès, mais l\'envoi de l\'e-mail de confirmation n\'a pas fonctionné';
					$data['class'] = 'warning';
					// @TODO : eventuellement, enregistrer ou envoyer à un admin la chaîne retournée par $this->email->print_debugger()
				}

				$ajax_valid = true;
			}
			else {
				// Erreur à l'insertion d'une nouvelle ligne dans la table 'user'
				$data['message'] = 'Vous avez bien rempli le formulaire, mais l\'inscription a échoué. Veuillez réessayer';
				$errors[] = 'Si le problème persiste, contactez un administrateur par email ou par téléphone';
			}
		}
		else {
			// Il y a au moins une erreur de remplissage dans le formulaire, on demande de corriger
			$data['message'] = 'Inscription impossible, merci de corriger les erreurs suivantes :';
		}

		// Récupération du message de retour via la vue dédiée à l'AJAX, et renvoi en JSON
		$data['errors'] = $errors;
		$json_result = array('ajax_valid' => $ajax_valid);
		$json_result['notice'] = $this->load->view('public/public_ajax_result.php', $data, TRUE);
		die(json_encode($json_result));
	}

	function notice()
	{
		$data['class'] = $this->input->post('class');
		$data['message'] = $this->input->post('message');
		$this->load->view('public/public_ajax_result.php', $data);
	}
}
